package encryption

import (
	"bytes"
	"encoding/json"
	"strings"

	"github.com/gin-gonic/gin"
)

// encryptRequest 定义加密请求的结构
type encryptRequest struct {
	Data     string `json:"data" binding:"required"`
	Password string `json:"password" binding:"required"`
}

// decryptRequest 定义解密请求的结构
type decryptRequest struct {
	Data     string `json:"data" binding:"required"`
	Password string `json:"password" binding:"required"`
}

// EncryptHandler 处理加密请求
func EncryptHandler(c *gin.Context) {
	var req encryptRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(400, gin.H{
			"status":  400,
			"message": "参数验证失败: " + err.Error(),
		})
		return
	}

	// 创建加密器
	encryptor := &AESEncryption{}

	// 创建输入和输出缓冲区
	input := strings.NewReader(req.Data)
	var output bytes.Buffer

	// 执行加密
	if err := encryptor.Encrypt(input, &output, req.Password); err != nil {
		c.JSON(500, gin.H{
			"status":  500,
			"message": "加密失败: " + err.Error(),
		})
		return
	}

	// 直接返回加密结果的原始字节数据，而不是字符串
	c.Data(200, "application/json", output.Bytes())
}

// DecryptHandler 处理解密请求
func DecryptHandler(c *gin.Context) {
	var req decryptRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(400, gin.H{
			"status":  400,
			"message": "参数验证失败: " + err.Error(),
		})
		return
	}

	// 创建解密器
	encryptor := &AESEncryption{}

	// 创建输入和输出缓冲区
	input := strings.NewReader(req.Data)
	var output bytes.Buffer

	// 执行解密
	if err := encryptor.Decrypt(input, &output, req.Password); err != nil {
		c.JSON(500, gin.H{
			"status":  500,
			"message": "解密失败: " + err.Error(),
		})
		return
	}

	// 尝试美化JSON输出
	var jsonObj interface{}
	if err := json.Unmarshal(output.Bytes(), &jsonObj); err != nil {
		// 如果不是有效的JSON，返回原始内容
		c.Data(200, "application/json", output.Bytes())
		return
	}

	// 如果是有效的JSON，美化后返回
	prettyJSON, err := json.MarshalIndent(jsonObj, "", "  ")
	if err != nil {
		c.Data(200, "application/json", output.Bytes())
		return
	}

	c.Data(200, "application/json", prettyJSON)
}